#pragma once


#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#include <error.h>
#include <errno.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/socket.h>
#include <signal.h>
#include <wait.h>
#include <stdbool.h>
#include "Queue.h"

#define N 4
#define IP "127.0.0.1"
#define PORT "8080"




typedef struct
{
    char name[30];
} FileName_t;

typedef struct
{
    // 阻塞队列
    Queue_t* Q;
    // 线程数量
    int number;
    // 线程pid数组
    pthread_t pthread_arr[N];
    // 互斥量
    pthread_mutex_t mutex;
    // 条件变量
    pthread_cond_t cond;
    // 全局状态
    bool alive;

} Pool_t;

// 创建线程池
Pool_t* create_pool(void);

// 初始化线程池
void init_pool(Pool_t* pool);

// 绑定端口，地址
void tcp(int* fd, const char* ip, const char* port);

// 增加监听对象
void epoll_add(int epoll_fd, int sock_fd);

// 任务入队列，唤醒线程
void awaken(Pool_t* pool, int sock_fd);

// 子线程与用户交互的流程
int son(int sock_fd);

// 计算文件哈希值
void file_hash(const char* file_name);

// 信号处理函数(SIGINT 2)
void handler(int signal);

